package com.star.learn.excel.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置类
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 创建一个新的RedisTemplate实例，它是与Redis交互的主要类
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置Redis连接工厂，它负责创建与Redis服务器的实际连接，由SpringBoot自动配置并通过参数注入的
        template.setConnectionFactory(factory);

        // 使用默认Jackson序列化器，无需自定义ObjectMapper
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);

        // Redis键的序列化器StringRedisSerializer：确保所有Redis键都是纯字符串，符合Redis最佳实践，便于管理和调试
        template.setKeySerializer(new StringRedisSerializer());
        // Redis 普通值的序列化器为Jackson序列化器：所有存储到Redis的对象都会被序列化为JSON格式
        template.setValueSerializer(serializer);
        // Redis Hash 结构中键的序列化器为 StringRedisSerializer：与普通键类似，Hash的键也保持为纯字符串格式
        template.setHashKeySerializer(new StringRedisSerializer());
        // Redis Hash 结构中值的序列化器为Jackson序列化器：Hash中的值会被序列化为JSON格式
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }
}
